1.0		[Rapport entre asm et cracking, fondements de l'asm]
		^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Ce texte fait partie du tutorial de TiTi. Soyez sr d'avoir lu le fichier introduction.txt avant de commencer ce fichier.

Compilation et assembleur
^^^^^^^^^^^^^^^^^^^^^^^^^
* Vous vous tes peut tre dja demand comment il tait possible pour un cracker de "lire un programme" sous forme executable et de le modifier, indpendemment du langage dans lequel celui-ci a t crit. Cela est du  la notion de "compilation".

* Lorsqu'un programmeur ralise une application, il ustilise des instructions spcifiques  son langage, comme "if", "then" ou "case of". Il peut ensuite enregistrer son code source dans un fichier, et le "compiler". Le compilateur va transformer le code source spcifique au langage en "code machine", ou assembleur qui peut tre interprt par la classe de processeurs conrrespondant au compilateur. Si le programme a t compil sous DOS/WINDOWS, l'excutable sera en assembleur ix86, c'est  dire le langage des proecesseurs d'intel. Il existe d'autres formes d'assembleur, comme l'assembleur Motorola 68000 (Ti-92). Nous allons nous intresser seulement  l'assembleur i386.

* Lorsque vous avez un programme excutable sur votre disque dur, celui-ci est donc "en assembleur". Bien sr, si vous l'ouvrez sous edit, vous ne verrez pas d'instructions d'assembleur, mais les caractres ASCII correspondants  ces instructions. Il nous faut donc un programme capable de retransformer ces codes ASCII en instructions d'assembleur. Il nous faut un "dsassembleur". Nous allons ici utiliser W32Dasm 8.9 qui permet de dsassembler les applications windows.

Interruptions et API
^^^^^^^^^^^^^^^^^^^^

* Au temps de MS-DOS, le systme d'exploitation mettait  disposition des programmes un certain nombre d'interruptions. Par exemple, la fonction 9 de l'interrution 21h permet d'affichier un message  l'cran. Sous windows, pour parler "trs" grossirement, on peut dire que l'API remplace les interruptions. Par exemple, la fonction de l'API GetWindowText(HWND, LPTSTR, int) copie le texte d'un contrle vers un buffer. De meme que les programmeurs DOS qui codent dans des langages de haut niveau n'ont pas  se soucier des interruptions du DOS et des instructions assembleur, un programmeur Delphi n'a pas besoin d'utiliser directement l'API de windows, et encore moins de connaitre l'assembleur.

* Pour comprendre comment fonctionne un programme deja compil, le dsassembleur seul est peu efficace. Mieux vaut utiliser un debugger qui permettra d'excuter le programme pas--pas (les instructions assembleurs les unes apres les autres) et de mieux le comprendre. Un exemple de debugger DOS est Tubo debugger de Borland. Mais une nouvelle sorte de debugger a vue le jour avec Soft-Ice. Dans sa version DOS, ce programme permet d'excuter un programme normalement, et de l'interrompre par simple combinaison de touches afin d'arriver sur le dbugger o on peut alors l'excuter pas--pas. Le cracker peut aussi mettre en place des "breakpoints" pour que le programme s'arrete s'il excute une certaine action (par exemple une interruption). Sous windows,  cause du multitche, on ne peut arreter un certain programme par combinaison de touches. En effet, au moment on dcide d'appeller Sof-Ice, on n'est pas sr du tout que le processus en cours appartient au programme que l'on veut cracker. On est donc oblig de passer par des breakpoints. Un breakpoint sur une fonction de l'API par exemple... Nous reviendrons sur Soft-Ice dans la suite de ce tutorial.

L'assembleur
^^^^^^^^^^^^

Tout d'abord, une instruction assembleur s'appelle une mnmonique. Pour travailler, le processeur utilise des registres.

1. Les registres
----------------

Les registres sont de (trs) petits emplacements de mmoire situs dans le processeur, et que celui-ci peut manipuler  sa guise, ou plutot  celle du programmeur ;) Normalement, les registres ont une taille de 16 bits (2 octets). Avec les 386, les registres se sont tendus  32 bits (4 octets). On peut toujours utiliser les registres de 16 bits, comme avant. Pour utiliser les 32 bits d'un registre, il faut placer un "E" avant le nom du registre.

a) Les registres de travail (ax, bx, cx, dx)
 Bon, je sais, les noms ne sont pas tres parlants ;)

ax : l'accumulateur, il est utilis dans les oprations arithmtiques
bx : registre de base
cx : le compteur, utilis pour des instructions comme "loop"
dx : le registre de "data"

Ces registres sont diviss en deux : ax en al et ah, bx en bl et bh, etc

b) Les registres de segment
CS : code segment. Il contient l'adresse du segment de mmoire qui contient le code mahine
DS : data segment. Il contient l'adresse du segment contenant les donnes du programme
SS : stack segment. Il contient l'adresse du segment de pile
ES : extra segment. Il contient l'adresse d'un segment supplmentaire

c) Les registres d'offset

Ces 5 registres contiennent une valeur  combiner avec un registre de segment pour former une adresse mmoire segment:offset

SI : source index, utilis lors des oprations sur les chanes de caractre (intressant pour les serials :), il est est associ  DS pour former l'adresse DS:SI
DI : destination index. Associ  DS ou  ES lors d'oprations sur les chaines de caractre.
IP : (non non, c'est pas le truc qu'il faut pour nuker quelqu'un :p) Instruction pointer, il est associ  CS pour pointer sur la prochaine instruction  excuter. Inutile de vous dire que vous ne pouvez pas le modifier directement ;)
BP : base pointer. Associ  SS, il permet d'accder  la pile (stack) lors d'appels de sous programmes.
SP : associ  SS, SS:SP indique le dernier lment de la pile.

d) Le registre de flags
Ce registre est un ensemble d'indicateurs. Commme le zero flag, par exemple, ou le parity flag. Certaines instructions modifient ces flags pour permettre  un saut conditionnel par exemple de savoir ce qu'il doit faire.

Lorsqu'un registre est crit avec des crochets, il ne reprsente plus une suite de bits, mais le contenu de l'adresse sur lequel il pointe.

2. Les instructions de base
---------------------------

* L'instruction la plus connue est sans doute l'instruction mov. Elle permet de COPIER (et non PAS dplacer) le contenu d'un registre dans un autre, ou de copier un nombre dans un registre, etc
forme : mov dest,src
ex : mov ax,bx copie le contenu de bx dans ax
mov bx,4 met "4" dans bx

mov [bx],4 : met 4  l'adresse sur laquelle pointe bx. Le problme est que on ne sait pas si "4" doit tre considr comme un octet, deux octets, 4 octets... Lorsque l'on fait mov bx,4 on sait que l'opration se fera sur 16 bits, car c'est la taille du registre bx. Ici, il faut prciser comme suit :
mov byte ptr [bx],4 ou
mov word ptr [bx],4

un word = un mot, c'est  dire deux octets (bytes)

* L'intruction CMP
Elle compare des registres ou des emplacements de mmoire. Selon le resultat, elle va changer quelques indicateurs. Si les deux oprandes sont gaux, par exemple, le zera flag va entre autre estre mis  zero. On pourra grer ce rsultat par un saut conditionnel.
ex : cmp ax,bx

* Les instructions INC et DEC
Ajoute 1  la valeur d'un registre. L'instruction dec fait l'inverse
inc ax

* L'instruction ADD
add ax,bx ajoute  ax le contenu de bx

* L'instruction NOP
Nop veut dire non oprate (c'est aussi un super cracker ;), le processeur ne fait rien et l'ignore. Elle est tres utile pour patcher certaines instructions gnantes dans un logiciel.

* L'instruction AND
Elle effectue un ET logique en traitant les deux oprandes bit  bit... Un et logique donne 1 si les deux oprandes sont  1

* L'instruction OR
Elle effectue un ou logique. Elle retourne 1 si un des deux oprandes est  1.
Elle est souvent utilise pour tester qu'un registre est  0. Or ax,ax ne renvoie 0 dans ax que si tous les bits de ax sont  zero. Le zero flag est affect, et permet un branchement conditionnel.

* L'instruction XOR
Elle effectue un ou exclusif. Il faut que l'un des bits soit  1, mais pas les deux.

* L'instruction TEST
Elle effectue un ET logique, mais ne modifie pas les oprandes. Seuls les indicateurs le sont. C'est un excellent moyen de vrifier qu'un registre est  zero. (par test eax, eax par exemple)

3. Les instructions de branchement
----------------------------------

* L'instruction JMP
Elle effectue un saut  l'adresse spcifie. Le programme continuera son excution  l'adresse spcifie. Elle est l'quivalent de la commande goto des langages de haut niveau.

* L'instruction CALL
Elle appelle un sous programme  l'adresse spcifie. Celui-ci doit se terminer par une instruction RET qui dira au processeur de reprendre le programme apres le dernier CALL.

* Les sauts conditionnels
Ils testent les flags pour savoir si un saut doit avoir lieu ou non.

JE ou NZ : saute si le zero flag est  1
JNE ou JNZ : saute si le zero flag est  0

CMP ax,bx	met le zero flag  1 si les deux registres ont la meme valeur
JE 12345 	saute  l'adresse 12345 si le zero flag est  1

Il y a BEAUCOUP d'autres sauts conditionnels. Mais je ne peux tous vous les dtailler ici.

4. La pile
----------

La pile est une zone mmoire qui sert  stocker temporairement des donnes. On peut rajouter une donne en l'empilant, et en lire une en la dpilant. On ne peut donc que lire la dernire donne sur la la pile. C'est une structure de type LIFO : Last In First Out.
Le dernier lment de la pile est  l'adresse SS:PP. Il ne faut pas modifier PP directement, il faut utiliser les instructions d'empilage et de dpilage.
L'instruction d'empilage est push
 push ax ajoute la valeur de ax  la paile
L'instruction de dsempilage est pop
 pop ax met dans ax la valeur du dernier lment de la pile

===========

Voil, j'espre que vous vous tes un peu familiaris avec l'assembleur. Pour commencer  cracker, vous n'avez pas besoin de connaitre tout ce cours. Achetez un livre de rfrence sur l'assembleur et vous apprendrez au fur et  mesure, en craquant. Si l'assembleur vous intresse, essayez de comprendre les nombreux sources que vous pourrez trouver sur Internet. Comprendre le fonctionnement de l'excellent "byte hunter" de NOP & The_Q est trs intressant et vous apprendra beaucoup.

Vous pouvez maintenant passer  la suite de ce tutorial : "Trouver le bon numro de srie.txt"
Le cracking peut commencer !!

	- TiTi